package com.tanhua.manage.utils;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.huawei.ais.sdk.AisAccess;
import com.huawei.ais.sdk.util.HttpClientUtils;
import org.apache.commons.codec.binary.Base64;
import org.apache.http.HttpResponse;
import org.apache.http.entity.StringEntity;
import org.springframework.beans.factory.annotation.Value;

import java.io.InputStream;
import java.util.Map;

/**
 * @ author 罗鹏鑫
 * @ Create 2021/6/8 16:37
 *
 * 华为云的内容检测工具类
 *    包括文本检测和图片检测
 */


public class CheckUitls {

    private static String accessKeyId = "WUQPPBZ4184ST0YEZFEE";
    private static String secretAccessKey ="QZvcMsFTLczZJXWA8Vf5gXya2pZqPz6AWgehYZy0";

    //获得客户端对象
    public static AisAccess getService(){
        // 1. 配置好访问文本内容检测服务的基本信息,生成对应的一个客户端连接对象
        AisAccess service = ServiceAccessBuilder.builder()
                .ak(accessKeyId)                       // your ak
                .sk(secretAccessKey)                  // your sk
                .region("cn-north-4")               // 内容审核服务目前支持华北-北京(cn-north-4)、华东上海一(cn-east-3)、亚太-新加坡(ap-southeast-3)以及亚太-香港(ap-southeast-1)
                .connectionTimeout(5000)            // 连接目标url超时限制
                .connectionRequestTimeout(1000)     // 连接池获取可用连接超时限制
                .socketTimeout(20000)               // 获取服务器响应数据超时限制
                .retryTimes(3)                      // 请求异常时的重试次数
                .build();

        return service;
    }

    /**
     * 文本检测
     * @param textContent  需要检测的文字内容
     */
    public static String textCheck(String textContent){
        //获得客户端对象
        AisAccess service = getService();

        try {
            //
            // 2.构建访问文本内容检测服务需要的参数
            String uri = "/v1.0/moderation/text";

            JSONObject json = new JSONObject();
            // 注：检测场景支持默认场景和自定义词库场景
            // 自定义词库配置使用可参考:https://support.huaweicloud.com/api-moderation/moderation_03_0027.html
            json.put("categories", new String[] {"porn","politics", "ad", "abuse", "contraband", "flood"});

            JSONObject text = new JSONObject();
            text.put("text", textContent);
            text.put("type", "content");

            JSONArray items = new JSONArray();
            items.add(text);

            json.put("items", items);

            StringEntity stringEntity = new StringEntity(json.toJSONString(), "utf-8");

            // 3.传入文本内容检测服务对应的uri参数, 传入文本内容检测服务需要的参数，
            // 该参数主要通过JSON对象的方式传入, 使用POST方法调用服务
            HttpResponse response = service.post(uri, stringEntity);

            // 4.验证服务调用返回的状态是否成功，如果为200, 为成功, 否则失败。
            ResponseProcessUtils.processResponseStatus(response);

            // 5.处理服务返回的字符流，输出识别结果。
            JSONObject jsonObject = JSON.parseObject(HttpClientUtils.convertStreamToString(response.getEntity().getContent()));
           // System.out.println(JSON.toJSONString(jsonObject, SerializerFeature.PrettyFormat));
            Map result = (Map) jsonObject.get("result");
            String suggestion = (String) result.get("suggestion");
            return suggestion;

        } catch (Exception e) {
            e.printStackTrace();
            return null;
        } finally {
            // 6.使用完毕，关闭服务的客户端连接
            service.close();

        }
    }

    /**
     * 图片内容检测
     * @param url
     */
    public static void imageCheck(String url){
        //获得客户端对象
        AisAccess service = getService();
        try {
            //
            // 2.构建访问图像内容检测服务需要的参数
            //
            String uri = "/v1.0/moderation/image";

            JSONObject json = new JSONObject();

           // String url="http://tanhua-dev.oss-cn-zhangjiakou.aliyuncs.com/images/logo/3.jpg";
            json.put("url", url);
            json.put("categories", new String[] {"politics", "terrorism", "porn", "ad"}); //检测内容
            json.put("threshold", 0);

            StringEntity stringEntity = new StringEntity(json.toJSONString(), "utf-8");

            // 3.传入图像内容检测服务对应的uri参数, 传入图像内容检测服务需要的参数，
            // 该参数主要通过JSON对象的方式传入, 使用POST方法调用服务
            HttpResponse response = service.post(uri, stringEntity);

            // 4.验证服务调用返回的状态是否成功，如果为200, 为成功, 否则失败。
            ResponseProcessUtils.processResponseStatus(response);

            // 5.处理服务返回的字符流，输出识别结果。
            ResponseProcessUtils.processResponse(response);


           // System.out.println("======================");

          //  String s = HttpClientUtils.convertStreamToString(response.getEntity().getContent());
           // System.out.println("s = " + s);
//            JSONObject jsonObject = JSON.parseObject(HttpClientUtils.convertStreamToString(response.getEntity().getContent()));
//            System.out.println(JSON.toJSONString(jsonObject, SerializerFeature.PrettyFormat));
            //return response;
        } catch (Exception e) {
            e.printStackTrace();
            //return null;
        } finally {
            // 6.使用完毕，关闭服务的客户端连接
            service.close();
        }
    }

    /**
     * 图片内容检测   批量检测
     * @param urls
     */
    public static void imageCheck(String[] urls){
        //获得客户端对象
        AisAccess service = getService();
        try {
            //
            // 2.构建访问图像内容批量检测服务需要的参数
            //
            String uri = "/v1.0/moderation/image/batch";

            JSONObject json = new JSONObject();

            // api请求参数说明可参考：https://support.huaweicloud.com/api-moderation/moderation_03_0036.html
            json.put("urls", urls);
            json.put("categories", new String[] {"politics", "terrorism", "porn", "ad"}); //检测内容
            json.put("threshold", 0);

            StringEntity stringEntity = new StringEntity(json.toJSONString(), "utf-8");

            // 3.传入图像内容批量检测服务对应的uri参数, 传入图像内容批量检测服务需要的参数，
            // 该参数主要通过JSON对象的方式传入, 使用POST方法调用服务
            HttpResponse response = service.post(uri, stringEntity);

            // 4.验证服务调用返回的状态是否成功，如果为200, 为成功, 否则失败。
            ResponseProcessUtils.processResponseStatus(response);

            // 5.处理服务返回的字符流，输出识别结果。
            ResponseProcessUtils.processResponse(response);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {

            // 6.使用完毕，关闭服务的客户端连接
            service.close();
        }
    }



    /**
     * 图片内容检测
     * @param imagebytes
     */
    public static void imageCheck(byte[] imagebytes){
        //获得客户端对象
        AisAccess service = getService();
        try {
            //
            // 2.构建访问图像内容检测服务需要的参数
            //
            String uri = "/v1.0/moderation/image";

            String fileBase64Str = Base64.encodeBase64String(imagebytes);

            JSONObject json = new JSONObject();

            // api请求参数说明可参考: https://support.huaweicloud.com/api-moderation/moderation_03_0019.html
            json.put("image", fileBase64Str);
            json.put("categories", new String[] {"politics", "terrorism", "porn", "ad"}); //检测内容
            json.put("threshold", 0);
            // 配置审核规则请参考：https://support.huaweicloud.com/api-moderation/moderation_03_0063.html
            json.put("moderation_rule", "default");

            StringEntity stringEntity = new StringEntity(json.toJSONString(), "utf-8");

            // 3.传入图像内容检测服务对应的uri参数, 传入图像内容检测服务需要的参数，
            // 该参数主要通过JSON对象的方式传入, 使用POST方法调用服务
            HttpResponse response = service.post(uri, stringEntity);

            // 4.验证服务调用返回的状态是否成功，如果为200, 为成功, 否则失败。
            ResponseProcessUtils.processResponseStatus(response);

            // 5.处理服务返回的字符流，输出识别结果。
            ResponseProcessUtils.processResponse(response);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {

            // 6.使用完毕，关闭服务的客户端连接
            service.close();
        }
    }
}
